﻿using Nemerle.Text;
using Nemerle.Utility;
using Nemerle.Data;

using System;
using System.Collections.Generic;
using System.Linq;

using FsCheck.Fluent;

namespace QCTests
{
  /// <summary>
  /// Description of FunctionsTest.
  /// </summary>
  module TestTuples
  {
    public Run() : void
    {
      _ = DefaultArbitraries.Add.[NArbitraries]();
      
      Spec.ForAny((x : int, y : int) => (x,y).First() == x)
        .QuickCheck("First2");
        
      Spec.ForAny((x : int, y : int) => (x,y,x + y).First() == x)
        .QuickCheck("First3");
        
      Spec.ForAny((x : int, y : int) => (x,y).Second() == y)
        .QuickCheck("Second2");
        
      Spec.ForAny((x : int, y : int) => (x,y,x + y).Second() == y)
        .QuickCheck("Second3");
        
      Spec.ForAny((x : int, y : int) => (x,y,x + y).Third() == x + y)
        .QuickCheck("Third3");
        
      Spec.ForAny(t : int * string => t.Swap().Swap().Equals(t))
        .QuickCheck("Swap_1");
        
      Spec.ForAny(t : int * string => !t.Swap().Equals(t))
        .QuickCheck("Swap_2");
        
      Spec.ForAny(t : int * string * int => t.Shift().Shift().Shift().Equals(t))
        .QuickCheck("Shift_1");
        
      Spec.ForAny(t : int * string * int => t.Shift().Shift().Equals(t.ShiftRight()))
        .QuickCheck("Shift_2");
        
      Spec.ForAny(t : int * string * int => t.Shift().Equals(t.ShiftRight().ShiftRight()))
        .QuickCheck("Shift_3");
        
      Spec.ForAny(t : int * string * int => t.Equals(t.ShiftRight().ShiftRight().ShiftRight()))
        .QuickCheck("Shift_4");
    }
  }
}
